// cf-528d
// 题意：
// 给定一个字符串S(|S|<=200000)，和字符串(|T|<=200000)，字符串仅由
// A, T, G, C组成，如果T字符串的第j位和S字符串的第i位能匹配，只要满足
// 存在p(1<=p<=|S|)，且|(i+j-1)-p|<=k(k是给定的，属于[0, 200000])，
// 且S[p]==T[j]，那么可以认为S的第i位和T的第j位匹配，然后要问S中有多少
// 个开始位置，可以匹配完整的T串。
//
// 题解：
// 首先，对于每个字符ch，我们可以O(n)处理出来S的这个位置可不可以匹配
// ch。然后对于S我们就得到了一个01的串，我们对于T也提取出对应字符，
// 也得道了一个01串，把这两个看成多项式，f(S)*f(rev(T))就可以得道
// S的某位置i，如果去匹配T串的话，可以匹配多少个对应字符ch。
//
// 然后所有4种字符加起来，如果某个位置能匹配字符的和为|T|，那么说明
// 这个位置可以匹配一个字符串T，对答案贡献+1。
//
// run: $exec < input
#include <iostream>
#include <algorithm>
#include <complex>
#include <cmath>
#include <string>

int const maxn = 800000;
char const alpha[] = {'A', 'T', 'G', 'C'};

int n, m, k;
std::string s;
std::string t;
int a[maxn], b[maxn], res[maxn];
int match[maxn];

namespace fft
{
	using base = std::complex<double>;
	double const pi = std::acos(-1);

	int rev[maxn];
	base wlen_pw[maxn];

	void fft(base a[], int n, bool invert)
	{
		for (int i = 0; i < n; i++)
			if (i < rev[i]) std::swap(a[i], a[rev[i]]);

		for (int len = 2; len <= n; len *= 2) {
			double ang = (2 * pi / len) * (invert ? -1 : 1);
			int len2 = len / 2;
			base wlen(std::cos(ang), std::sin(ang));
			wlen_pw[0] = base(1, 0);
			for (int i = 1; i < len2; i++)
				wlen_pw[i] = wlen_pw[i - 1] * wlen;

			for (int i = 0; i < n; i += len) {
				base t, *pu = a + i, *pv = a + i + len2, *pu_end = a + i + len2, *pw = wlen_pw;
				for (; pu != pu_end; ++pu, ++pv, ++pw) {
					t = *pv * *pw;
					*pv = *pu - t;
					*pu += t;
				}
			}
		}

		if (!invert) return;
		for (int i = 0; i < n; i++) a[i] /= n;
	}

	base fa[maxn], fb[maxn];
	int calc_last = -1;

	void calc_rev(int n)
	{
		if (n == calc_last) return;
		int logn = 0;
		while ((1 << logn) < n) logn++;
		for (int i = 0; i < n; i++) {
			rev[i] = 0;
			for (int j = 0; j < logn; j++)
				if (i & (1 << j))
					rev[i] |= 1 << (logn - j - 1);
		}
		calc_last = n;
	}

	void multiply(int a[], int n1, int b[], int n2, int res[], int & len)
	{
		int n = 1;
		while (n < std::max(n1, n2)) n *= 2;
		n *= 2; len = n;

		for (int i = 0; i < n1; i++) fa[i] = a[i];
		for (int i = 0; i < n2; i++) fb[i] = b[i];
		for (int i = n1; i < n; i++) fa[i] = 0;
		for (int i = n2; i < n; i++) fb[i] = 0;

		calc_rev(n);
		fft(fa, n, false); fft(fb, n, false);
		for (int i = 0; i < n; i++) fa[i] *= fb[i];
		fft(fa, n, true);

		for (int i = 0; i < n; i++)
			res[i] = std::round(fa[i].real());
	}
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::cin >> n >> m >> k >> s >> t;
	for (int i = 0; i < 4; i++) {
		char ch = alpha[i];
		int last = -k - 1;
		for (int i = 0; i < n; i++) {
			if (ch == s[i]) last = i;
			a[i] = (i - last) <= k;
		}
		last = n + k + 1;
		for (int i = n - 1; i >= 0; i--) {
			if (ch == s[i]) last = i;
			if (!a[i]) a[i] = (last - i) <= k;
		}
		for (int i = 0; i < m; i++)
			b[i] = ch == t[m - i - 1];
		int len;
		fft::multiply(a, n, b, m, res, len);
		for (int i = 0; i < n; i++)
			match[i] += res[i];
	}
	int ans = 0;
	for (int i = 0; i < n; i++)
		if (match[i] == m) ans++;
	std::cout << ans << "\n";
}

